import { Entity } from "../entity/Entity";
import { Register} from "../register/Register";
import {Destroy} from "../component/index";
import { ComponentType } from "../component/Component";
/**
 * @memberof w
 * @extends w.Entity
 */
class Group extends Entity {
    /**
     * @constructor
     * @param {*} opts 
     */
    constructor(opts = {}) {
        super(opts);
        this._type="Group";
        this.entities = new Set();
    }
    /**
     * 添加实体对象
     * @param {w.Entity} 实体对象。
     * @method
     */
    addEntity(entity) {
        if(entity.group===this.id){//无需重复添加
            return;
        }
        entity.group=this.id;
        this.entities.add(entity.id);
        // Register.instance.entityManager.add(entity);
        entity.update();
    }
    /**
     * 移除指定id的实体对象。
     * @method
     */
    removeEntity(id,destroy=true) {
        let entity=this.getEntity(id);
        this.entities.delete(id);
        entity.group=null
        if(destroy){
            entity.destroy();
        }else{
            entity.update();
        }
    }
    /**
     * 移除所有实体对象。
     * @method
     */
    removeAllEntity() {
        this.entities.forEach((id)=>{
            this.removeEntity(id);
        })
    }
    /**
     * 根据所有的实体对象。
     * @method
     * @param {Stirng} id 
     * @return {Entity} 返回实体。 
     */
    getAllEntity(){
        let entities=[];
        this.entities.forEach(id=>{
            let entity=this.getEntity(id);
            if(entity){
                entities.push(entity); 
            }
        })
        return entities;
    }
    /**
     * 根据id获取实体对象。
     * @method
     * @param {Stirng} id 
     * @return {Entity} 返回实体。 
     */
    getEntity(id) {
        return Register.instance.entityManager.get(id);
    }
    /**
     * 获取名称为name的所有实体对象。
     * @method
     * @param {Stirng} name 实体的名称。
     * @return {Array<Entity>} 返回实体数组。 
     */
    getEntityByName(name) {
        let entites=[];
        for (const id of this.entities) {
            const entity=Register.instance.entityManager.get(id)
            if (name === entity.name) {
                entites.push(entity);
            }
        }
        return entites;
    }
    /**
     * 获取类型为type的所有实体对象。
     * @method
     * @param {Stirng} type 
     * @return {Array<Entity>} 返回实体数组。 
     */
    getEntityByType(type) {
        let entites=[];
        for (const id of entities) {
            const entity=Register.instance.entityManager.get(id)
            if (type === entity.type) {
                entites.push(entity);
            }
        }
        return entites;
    }
    /**
     * 组的销毁
     * @method
     * @param {Boolean} task 【是否任务化，缺省值:true】任务化则不会立刻执行销毁，会在浏览器空闲时间执行，如果空闲时间不够则会在帧时间强制销毁。
     */
    destroy(task=true){
        this.visibility=false;
        this.removeFromParent();
        //重新打包
        const meshRednerCom = Register.instance.manager(ComponentType.MeshRender).get("x");
        meshRednerCom.clear();
        if(task){
            this.addComponent(new Destroy());
        }else{
            Register.instance.entityManager.remove(this.id);//删除本身
            //遍历所有的group,执行销毁
            this.removeComponent(ComponentType.Destroy);//如果有销毁标记则移除
            for(let i=0;i<this.children.length;i++){
                this.children[i].destroy(false);
            }
            //销毁所有实体
            this.removeAllEntity();
            //销毁所有组件
            this.removeAllComponent();
        }
       
    }
}

export { Group }